package bil.download;

import bil.Config;
import bil.imagem.Imagem;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

/**
 *
 * @author Eduardo Folly
 */
public class Download implements Runnable {

    private Downloader down;
    private Imagem imagem;
    private String prefixo;

    public Download(Downloader down, Imagem imagem) {
        this.down = down;
        this.imagem = imagem;
        this.prefixo = down.getPastaPadrao() + File.separator;
    }

    @Override
    public void run() {
        Config config = Config.getInstance();
        int tenta = 0;

        if (!imagem.isSelected()) {
            imagem.setStatus("1 - Ignorado.");
            return;
        }

        while (tenta < config.getQtdTenta()) {
            String erro = "";
            try {
                imagem.setStatus("2 - Baixando...");

                URL url = new URL(imagem.getEndereco());

                int pos = imagem.getNome().lastIndexOf(".");
                String nome = imagem.getNome().substring(0, pos);
                String ext = imagem.getNome().substring(pos + 1);

                File saida = new File(prefixo + nome + "." + ext);

                int cont = 1;
                boolean valido = true;
                while (valido) {
                    if (saida.exists()) {
                        switch (config.getArqExiste()) {
                            case 0:
                                saida = new File(prefixo + nome + "_" + cont + "." + ext);
                                break;
                            case 1:
                                valido = false;
                                break;
                            case 2:
                                imagem.setStatus("1 - Ignorado.");
                                down.atualizaBarra();
                                return;
                        }
                    } else {
                        break;
                    }
                    cont++;
                }

                URLConnection con = url.openConnection();
                con.setRequestProperty("User-Agent", config.getUserAgent());
                con.setReadTimeout(config.getTimeOut() * 1000);

                int tamanho = con.getContentLength();
                if (tamanho <= 0) {
                    throw new java.io.FileNotFoundException();
                }

                imagem.setDownsize(tamanho);

                InputStream in = con.getInputStream();

                OutputStream out = new FileOutputStream(saida);

                byte[] buf = new byte[1024];
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                    imagem.setDownsun(len);
                    down.velocidade(len);
                }
                in.close();
                out.close();

                if (imagem.getDownsun() != imagem.getDownsize()) {
                    throw new java.io.IOException("Tamanho do arquivo inválido.");
                }

                imagem.setStatus("0 - OK.");

            } catch (java.io.FileNotFoundException e) {
                System.err.println(imagem.getId() + ": Arquivo nao encontrado. - " + imagem.getEndereco());
                erro = "9 - Arquivo não encontrado.";
                imagem.setStatus(erro);
            } catch (java.io.IOException ex) {
                System.err.println(imagem.getId() + ": Erro na conexao. - " + imagem.getEndereco());
                erro = "9 - Erro na conexão. - " + ex.getMessage();
                imagem.setStatus(erro);
                System.err.println(ex.getMessage());
            } catch (Exception exxx) {
                System.err.println(imagem.getId() + ": " + imagem.getEndereco());
                erro = "9 - " + exxx.getMessage();
                imagem.setStatus(erro);
                exxx.printStackTrace();
            } finally {
                if ((!erro.isEmpty()) && config.getQtdTenta() > 1) {
                    tenta++;
                    long tempo = config.getTempoTenta() * 1000;
                    while (tempo > 0) {
                        try {
                            String compl = " (" + tenta + " de " + config.getQtdTenta() + ")";
                            imagem.setStatus("2 - Nova tentativa em " + (tempo / 1000) + " segundos." + compl);
                            Thread.sleep(1000);
                            tempo -= 1000;
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    imagem.setStatus(erro);
                } else {
                    tenta = config.getQtdTenta();
                }
            }
        }
        down.atualizaBarra();
    }
}
